////////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENT_NETWORK_H_
#define _CLIENT_NETWORK_H_

////////////////////////////////////////////////////////////////////////////////

#include <queue>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;


////////////////////////////////////////////////////////////////////////////////

#include "network_packets.h"
#include "thread.h"

////////////////////////////////////////////////////////////////////////////////

class Mutex;


/** Game client network manager
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Jun 11th, 2009
*/
class ClientNetwork
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ClientNetwork( ServerPackets& _recvQueue,
                   ClientPackets& _sendQueue,
                   Mutex& _sendQueueMutex,
                   Mutex& _recvQueueMutex,
                   const std::string& _address,
                   const std::string& _sendPort,
                   const std::string& _recvPort );


    /** Destructor */
    virtual ~ClientNetwork();


////////////////////////////////////////////////////////////////////////////////


    /** Sends data to server */
    void Send();


    /** Sends data to server */
    void Receive();


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    ServerPackets& m_RecvQueue;
    ClientPackets& m_SendQueue;

    Mutex& m_SendQueueMutex;
    Mutex& m_RecvQueueMutex;

    std::string m_ServerAddress;
    std::string m_SendPort;
    std::string m_RecvPort;

    boost::asio::io_service m_IO_service;
    tcp::resolver m_Resolver;

    Thread* m_SendThread;
    Thread* m_RecvThread;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

